import bcrypt from 'bcrypt';
import { config } from '@/config';

/**
 * 密码工具类
 */
export class PasswordUtil {
  /**
   * 哈希密码
   */
  static async hashPassword(password: string): Promise<string> {
    try {
      return await bcrypt.hash(password, config.bcrypt.saltRounds);
    } catch (error) {
      throw new Error('密码加密失败');
    }
  }

  /**
   * 验证密码
   */
  static async comparePassword(
    password: string,
    hashedPassword: string
  ): Promise<boolean> {
    try {
      return await bcrypt.compare(password, hashedPassword);
    } catch (error) {
      throw new Error('密码验证失败');
    }
  }

  /**
   * 生成随机密码
   */
  static generateRandomPassword(length: number = 12): string {
    const charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*';
    let password = '';
    
    for (let i = 0; i < length; i++) {
      const randomIndex = Math.floor(Math.random() * charset.length);
      password += charset[randomIndex];
    }
    
    return password;
  }

  /**
   * 验证密码强度
   */
  static validatePasswordStrength(password: string): {
    isValid: boolean;
    errors: string[];
  } {
    const errors: string[] = [];

    // 长度检查
    if (password.length < 8) {
      errors.push('密码长度至少为8位');
    }

    // 包含大写字母
    if (!/[A-Z]/.test(password)) {
      errors.push('密码必须包含至少一个大写字母');
    }

    // 包含小写字母
    if (!/[a-z]/.test(password)) {
      errors.push('密码必须包含至少一个小写字母');
    }

    // 包含数字
    if (!/\d/.test(password)) {
      errors.push('密码必须包含至少一个数字');
    }

    // 包含特殊字符
    if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>?]/.test(password)) {
      errors.push('密码必须包含至少一个特殊字符');
    }

    return {
      isValid: errors.length === 0,
      errors,
    };
  }
}

export default PasswordUtil;